#include "AccountingVoucher.h"
#include "ui_AccountingVoucher.h"
#include <QtWidgets>
#include <ExcelManager.h>
#include <AccountingVoucher.h>
//#include <QtConcurrent>
#include "DebugTool.h"

void loadJsonDoc(AccountingVoucher *av){
    QFile   file("json/data.json");
    file.open (QFile::ReadWrite);
    QJsonParseError error;
    QJsonDocument jsonDoc = QJsonDocument::fromJson (file.readAll (),&error);
    file.close ();
    av->json = jsonDoc.object ();
    initJson( av );         // 加载json文档后，需要对比日期是否一致
}

void initJson( AccountingVoucher *av ){
    QJsonObject::iterator it =av->json.begin ();
    QString date = it.value ().toString ();
    QString dyear = date.section ('-',0,0);
    QString dmon = date.section ('-',1,1);

    Dout << date << dyear << dmon;

    QString cdate = av->ui->dateEdit->text ();
    QString cyear = cdate.section ('-',0,0);
    QString cmon = cdate.section ('-',1,1);
    Dout << cdate << cyear << cmon;

    if( (dyear!=cyear) || (dmon != cmon ) ) {
        Dout << it.value () ;
        it.value () = av->ui->dateEdit->text ();
        for (++it; it != av->json.end (); ++it) {
            it.value () = 0;
        }
    }
    Dout << av->json;
}

void saveJsonDoc(AccountingVoucher *av){
    QFile   file("json/data.json");
    file.open (QFile::ReadWrite);
    file.write (QJsonDocument(av->json).toJson ());
    file.close ();
}

// 构造函数
AccountingVoucher::AccountingVoucher(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::AccountingVoucher)
{
    ui->setupUi(this);
    ui->dateEdit->setDate (QDate::currentDate ());      // 日期设置为当前的日期
    loadJsonDoc(this);      // 加载jsondoc

    // QComboBox::currentTextChanged 信号，显示不同的序号
    connect(ui->comboBox, &QComboBox::currentTextChanged , this,&AccountingVoucher::onComboBoxTextChanged );
     // QDateEdit::dateChanged 信号，是否需要从新设置json
    connect (ui->dateEdit,&QDateEdit::dateChanged,[this]{
        initJson( this );
        onComboBoxTextChanged( ui->comboBox->currentText ());
    } );

    // 调用 onComboBoxTextChanged，设置spinbox的当前值
    onComboBoxTextChanged("收");

    // 初始化大小
    resize (1175,760);

    // 创建菜单
    createMenu();

    // 构造新的Dialog，会计科目选择项
    w = new Dialog(this);
    connectToDialog();  // 连接到会计科目Dialog的相关信号
}
/**
  * @brief :    析构函数，保存jsondooc
  */
AccountingVoucher::~AccountingVoucher()
{
    delete ui;
}

/**
  * @brief : 创建菜单, 并关联信号槽
  * @retval: None
  */
void AccountingVoucher::createMenu()
{

    QMenu *fileMenu = new QMenu("文件",this);     // <----------文件菜单
    menuBar ()->addMenu ( fileMenu );
    fileMenu->setProperty ("mandatoryField",false); // 增加属性，便于qss控制
    //
    QAction *fileOpenAct = new QAction("Open"); // <----------文件打开操作
    // 点击信号，并关联到 onFileOpen 槽函数
    connect (fileOpenAct,&QAction::triggered,this,&AccountingVoucher::onFileOpen);

    fileMenu->addAction (fileOpenAct);
    QToolBar *toolBar = addToolBar ("Top");
    toolBar ->addAction (fileOpenAct);

    QAction *fileSaveAct = new QAction("Save"); // <----------文件打开操作
    // 点击信号，并关联到 onFileOpen 槽函数
    connect (fileSaveAct,&QAction::triggered,this,&AccountingVoucher::onFileSave);

    fileMenu->addAction (fileSaveAct);
    toolBar ->addAction (fileSaveAct);
}

/**
  * @brief :     使用 QFileDialog  选择excel文件，并让本程序下沉，显示excel程序
  * @param :    None
  * @retval: None
  */
void AccountingVoucher::onFileOpen()
{
    QString fileName = QFileDialog::getOpenFileName (this,"打开","./","Excel文件 (*.xlsx);");
    if(fileName.isEmpty ())  return;
    Dout << fileName;
    this->lower ();     // 下层
    qExcel->openWorkBook (fileName);    // 调用excel程序打开指定的文件
}

/**
  * @brief :    会计科目表保存，修改json数据，保存到文件
  *             comboBox当前文本对应的json数据+1，即可
  * @param :
  * @param :
  * @retval: None
  */
void AccountingVoucher::onFileSave()
{
    QString txt = ui->comboBox->currentText ();
    int idx = json[txt].toInt () + 1;
    json[txt] = idx;
    Dout<<idx;
    saveJsonDoc (this);
    onComboBoxTextChanged(txt);
    appendExcel ();
}
/**
  * @brief :     comboBox的当前文本变化，根据当前文本获取对应的json的值，并加1后，给spinbox赋值
  * @param :  QString txt  ，对应combox的信号传递的参数
  * @param :
  * @retval: None
  */
void AccountingVoucher::onComboBoxTextChanged(const QString &txt)
{
    Dout << ui->comboBox->currentText () << txt;
    int min = json[ui->comboBox->currentText ()].toInt () + 1;
    ui->spinBox->setValue (min);
    Dout << txt << json[ui->comboBox->currentText ()].toInt ();
}

/**
  * @brief :       table项目双击，自定义Dialog.exec，通过Dialog::getItemText获取返回值
  * @param :    None
  * @retval: None
  */
void AccountingVoucher::connectToDialog()
{
  connect (ui->myTable,&QTableWidget::itemDoubleClicked, [this](QTableWidgetItem *item){
    if(item->column ()!=1) return ;
    QStringList list = w->getItemText ();
    if(list.count () == 0) return ;
    QString str;
    int i;
    for (i = 0; i < list.count () - 1; ++i) {
      str.append (list.at (i)).append (" - ");
    }
    str.append (list.at (i));
    item->setText (str);
    });
}
/**
  * @brief :   将table的数据添加到excel文件中
  * @retval: None
  */
void AccountingVoucher::appendExcel()
{
    int rows = ui->myTable->rowCount ();
    int cols = ui->myTable->columnCount ();
    Dout << rows << cols;
    QVariantList mList = ui->myTable->getRowData ();
    Dout << mList << mList.count ();
    if(mList.count ( ) == 0 )
        return;
    qExcel->appendToActSheet (mList);


}
